package com.example.controller;

import com.example.service.impl.TransactionalService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 事务测试入口
 */
@RestController
public class TransactionController {

	@Resource
	private TransactionalService transactionalService;

	/**
	 * 测试事务NOT_SUPPORTED与REQUIRED区别
	 * 1：notSupport不支持事务，如果当前存在事务，会将当前事务挂起，执行完成后再恢复当前事务
	 * 2：required如果当前存在事务，就加入当前事务。如果当前不存在事务就创建事务
	 *
	 *
	 * 事务NOT_SUPPORTED与什么注解都不加方法区别
	 * 1：什么注解都不加的方法，会包含到当前的事务中，可以认为加入当前事务，如果无注解的事务抛异常，则会回滚当前事务所有dml操作
	 * 2：但是NOT_SUPPORT是挂起当前事务，如果出错，当前notSupport修饰的方法不会回滚，向上抛出的异常会影响上一层事务是否回滚
	 *
	 * @return
	 */
	@PostMapping("/testTransactionNotSupport")
	public String testTransactionNotSupport(){
//		return transactionalService.testTransactionNotSupport();
		return null;
	}

	/**
	 * 测试事务超时场景
	 * @return
	 */
	@PostMapping("/testTransactionTimeOut")
	public String testTransactionTimeOut(){

		return transactionalService.testTransactionTimeOut();

	}

	/**
	 * 测试事务失效场景
	 * @return
	 */
	@PostMapping("/testTransactionInEffective")
	public String testTransactionInEffective(){
		return transactionalService.testTransactionInEffective();
	}

	/**
	 * 测试事务传播机制
	 * @return
	 */
	@PostMapping("/testTransactionReadOnly")
	public String testTransactionReadOnly(){
		return transactionalService.testTransactionReadOnly();
	}

	@PostMapping("/testTransaction")
	public String testTransaction(){
		transactionalService.addUserAndStudent();
		return "success";
	}


}
